package zmee.src.formplugin;

import kd.bos.bill.BillShowParameter;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.entity.datamodel.IDataModel;
import kd.bos.form.FormShowParameter;
import kd.bos.form.IFormView;
import kd.bos.form.control.Control;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.scm.common.util.BOTPUtil;

import java.util.EventObject;
import java.util.HashMap;
import java.util.Map;

/**
 * @author yss
 * @createTime 2022-11-28 7:03
 * @description
 */
public class AptitudeAuditSubmitBillPlugin extends AbstractFormPlugin {

    private static final String cancel1 = "zmee_cancel1";//一层取消
    private static final String btn1 = "zmee_btn1";//一层确认
    private static final String flowstop1 = "zmee_flowstop1";//一层流程中止
    private static final String cancel2 = "zmee_cancel2";//二层取消
    private static final String btn2 = "zmee_btn2";//二层确认
    private static final String content = "zmee_content";//内容

    @Override
    public void afterCreateNewData(EventObject e) {
        FormShowParameter formShowParameter = this.getView().getFormShowParameter();
        String typeStr = formShowParameter.getCustomParam("type");
        boolean viewType = formShowParameter.getCustomParam("isfirst");//是否为一层确认

        this.getView().setVisible(viewType,"zmee_flex1");
        this.getView().setVisible(viewType,"zmee_flex2");

        if("0".equals(typeStr)){//多次招标
//            4.	若“资审状态”字段为“已评分”且“资审结果”字段为“资审合格”的供应商数量<3，且项目启动单的“是否多次招标”字段内容为“是”，则弹窗提示“该流程为多次招标流程，资审合格供应商数量不符合开标条件，请确认供应商资审结果。若确定资审结果无误，点击【确定】按钮，执行后续流程；若终止流程点击【流程中止】”，并提供【取消】/【确认】/【流程中止】三个按钮：
//                  ①点击【取消】按钮，关闭弹窗；
//                  ②点击【确认】按钮，单据变为“提交”状态，进行后续流程；
//                  ③点击【流程中止】按钮，跳出弹窗进行二次确认，提供【确认】/【取消】按钮，点击【确认】按钮，系统自动将该流程中止，并调用BOTP生成一张新的项目启动单，重新发起流程。
            this.getModel().setValue(content,"该流程为多次招标流程，资审合格供应商数量不符合开标条件，请确认供应商资审结果。若确定资审结果无误，点击【确定】按钮，执行后续流程；若终止流程点击【流程中止】");
        }else if("1".equals(typeStr)){//不为多次招标
//            1.	点击【提交】按钮校验投标供应商数量，若“资审状态”字段为“已评分”且“资审结果”字段为“资审合格”的供应商数量<3，且项目启动单的“是否多次招标”字段内容为“否”，
//            则弹窗提示“投标供应商数量不符合开标条件，请确认供应商资审结果情况”，并提供【取消】/【流程中止】两个按钮：
//                  ①点击【取消】按钮，关闭弹窗；
//                  ②点击【流程中止】按钮，跳出弹窗进行二次确认，提供【确认】/【取消】按钮，点击【确认】按钮，系统自动将该流程中止，并调用BOTP生成一张新的项目启动单，重新发起流程。
            this.getModel().setValue(content,"投标供应商数量不符合开标条件，请确认供应商资审结果情况");
        }
    }

    @Override
    public void registerListener(EventObject e) {
        super.registerListener(e);
        this.addClickListeners(cancel1,btn1,flowstop1,cancel2,btn2);
    }

    @Override
    public void click(EventObject evt) {
        super.click(evt);
        Control source = (Control) evt.getSource();
        String key = source.getKey();
        IFormView view = this.getView();
        IDataModel model = view.getModel();
        IFormView parentView = view.getParentView();
        IDataModel parentModel = parentView.getModel();
        if(cancel1.equals(key)){//取消，关闭当前弹窗
            view.close();
        }else if(btn1.equals(key)){//确认，单据状态变为提交状态 billstatus
            parentModel.setValue("billstatus","B");
        }else if(flowstop1.equals(key)){
            //二次确认
            FormShowParameter formShowParameter = new BillShowParameter();
            Map<String, Object> customMap = new HashMap<>();
            customMap.put("isfirst",false);
            formShowParameter.setCustomParams(customMap);
            view.showForm(formShowParameter);
        }else if(cancel2.equals(key)){//二层取消
            view.close();
            parentView.close();
        }else if(btn2.equals(key)){//二层确认
            //获取当前启动项目信息
            IFormView aptitudeView = parentView.getParentView();
            IDataModel aptitudeModel = aptitudeView.getModel();
            DynamicObject dataEntity = aptitudeModel.getDataEntity(true);
            //单据编号
            String billno = dataEntity.getString("billno");
            DynamicObject srcProjectDy = BusinessDataServiceHelper.loadSingleFromCache("src_project", new QFilter[]{new QFilter("billno", QCP.equals, billno)});
            //调用botp 下推生成项目启动单
            Map<String, Object> botpResultMap = BOTPUtil.pushBill("src_project", "src_project", srcProjectDy, null);
            boolean isSuccess = (boolean) botpResultMap.get("succed");
            if(isSuccess){//下推成功
                //结束当前流程
                srcProjectDy.set("bizstatus","D");
                SaveServiceHelper.update(srcProjectDy);
                parentView.close();
                view.close();
            }else {
                this.getView().showErrorNotification(String.valueOf(botpResultMap.get("message")));
            }
        }
    }
}
